1. Field of the Invention
This invention pertains to computer software development tools.
2. Description of the Related Art
Some complex software systems must execute with high availability. This requirement means that any downtime or other disruptions to the systems must be minimized. For example, it is desirable to make major electronic commerce websites highly-available because any downtime results in lost revenues. Nevertheless, developers in charge of websites and other such systems often need to alter the software in order to resolve bugs, introduce new functions, and/or otherwise improve it. Therefore, it is an ongoing challenge to alter complex software systems without significantly impacting the systems' availability.
One technique for updating a website or other software system requiring high-availability is to use multiple servers running different versions of the software. The software on one set of servers can be upgraded while the website is run from another set of servers. However, this technique is often difficult to implement. For example, consider a software system that frequently accesses database tables. Any updates to the database schema often result in downtime of the affected tables. Moreover, the changes to the schema might affect any version of the software, meaning that one cannot simply run a website using an old version of the software while changing the database. Similarly, some software and hardware systems are structured in ways that make it difficult or impossible to run different versions of the software on different servers. As a result, there are high costs associated with modifying high-availability software systems.
Another technique for modifying high-availability software systems is partitioning the functionalities of the software systems into different sets. One set of functions is left running, while the other set is brought down (i.e., disabled) for maintenance. For example, one can partition the software for a website into core and non-core functions. The non-core functions are brought down temporarily while they are modified. The core functions, in contrast, are modified using specialized techniques that support high-availability.
A problem with this latter technique is that complex software systems are often difficult to partition. Typically, it is easy to identify the entry-points functions that provide a particular function. However, it is difficult to identify other functions and/or database tables that are used by those entry-point functions. This problem is particularly acute for object-oriented programming languages that use late binding (runtime binding) techniques. With these languages, the actual function invoked by a call is not known until the system executes. Late binding thus makes it difficult to perform a static analysis (i.e., compile-time analysis) of the system to identify functions and/or database tables used by other functions. Class-level dependency tools can be used to analyze the system but such tools often produce an explosion of dependencies that include almost the entire code base. While it is possible to do a runtime analysis (i.e., code trace) of the software system using test input data, the test data might not cover all code branches and result in an incomplete partition.
Therefore, there is a need in the art for a way to identify a set of code and/or database tables that can possibly be accessed by a given function in order to support partitioning and other types of analyses that does not suffer from the problems described above.